package com.okex.demo.task;

import com.okex.demo.model.TickerInfo;
import com.okex.demo.service.OkexApiService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

/**
 * 所有行情数据定时轮询任务
 * 专门负责查询并推送所有产品的行情数据
 * 与单个产品的行情信息轮询分开处理
 */
@Slf4j
@Component
public class AllMarketsPollingTask {

    @Autowired
    private OkexApiService okexApiService;

    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    /**
     * 定时查询并推送所有SWAP永续合约行情数据
     * 每5秒执行一次
     */
//    @Scheduled(fixedRate = 5000)
    public void pollAllSwapMarkets() {
        log.debug("执行定时任务: 查询所有SWAP永续合约行情数据");
        queryAllMarketsData("SWAP");
    }

    /**
     * 查询并推送所有某类型的产品行情数据
     * @param instType 产品类型，如 SWAP, SPOT, FUTURES, OPTION
     */
    public void queryAllMarketsData(String instType) {
        try {
            log.info("查询所有 {} 类型的产品行情数据", instType);

            // 获取指定类型的所有产品行情
            List<TickerInfo> tickers = okexApiService.getTickersList(instType, null, null);

            if (tickers != null && !tickers.isEmpty()) {
                // 设置更新时间
                Date now = new Date();
                for (TickerInfo ticker : tickers) {
                    ticker.setUpdateTime(now);
                    // 确保产品类型正确
                    if (ticker.getInstType() == null || ticker.getInstType().isEmpty()) {
                        ticker.setInstType(instType);
                    }
                }

                // 推送到所有行情主题
                log.info("推送 {} 条 {} 类型的产品行情数据到 /topic/all-markets", tickers.size(), instType);
                messagingTemplate.convertAndSend("/topic/all-markets", tickers);
            } else {
                log.warn("获取 {} 类型的产品行情数据为空", instType);
            }
        } catch (Exception e) {
            log.error("查询并推送 {} 类型的所有产品行情数据失败: {}", instType, e.getMessage(), e);
        }
    }
}
